/**********************************************
* @file    	led.h
* @author 	dralee
* @version	v1.0
* @date			2021-11-30
* @brief		LED应用接口定义
***********************************************/
#ifndef __LED_H
#define __LED_H

#include "stm32f10x.h"

// 定义LED连接端口
// 红
#define LEDR_GPIO_PORT				GPIOB									// GPIO端口
#define LEDR_GPIO_CLK					RCC_APB2Periph_GPIOB	// GPIO端口时钟
#define LEDR_GPIO_PIN					GPIO_Pin_5						// 连接到SCL时钟线的GPIO脚

// 绿
#define LEDG_GPIO_PORT				GPIOB									// GPIO端口
#define LEDG_GPIO_CLK					RCC_APB2Periph_GPIOB	// GPIO端口时钟
#define LEDG_GPIO_PIN					GPIO_Pin_0						// 连接到SCL时钟线的GPIO脚

// 蓝
#define LEDB_GPIO_PORT				GPIOB									// GPIO端口
#define LEDB_GPIO_CLK					RCC_APB2Periph_GPIOB	// GPIO端口时钟
#define LEDB_GPIO_PIN					GPIO_Pin_1						// 连接到SCL时钟线的GPIO脚

/******************************
* 亮、灭
*******************************/
#define ON				0
#define OFF				1

/****************************************************************
 * @brief 亮灭指定端口的灯
 * @param led 对应LED端口，LEDR_GPIO_PORT、LEDG_GPIO_PORT、LEDB_GPIO_PORT
 * @param pin led对应引脚
 * @param a 亮灭：ON/OFF
 * @retval 无
 ****************************************************************/
#define LED(led,pin,a) if (a) \
	GPIO_SetBits(led,pin);\
	else \
	GPIO_ResetBits(led,pin)

// 控制灯亮灭
#define LEDR(a) LED(LEDR_GPIO_PORT,LEDR_GPIO_PIN,a)
#define LEDG(a) LED(LEDG_GPIO_PORT,LEDG_GPIO_PIN,a)
#define LEDB(a) LED(LEDB_GPIO_PORT,LEDB_GPIO_PIN,a)

/*************************************
 * @brief 直接寄存器控制IO
 * @param p端口
 * @param i引脚号
 * @retval 无
*************************************/
#define digitalHigh(p,i)				{p->BSRR=i;}   	// 输出高电平
#define digitalLow(p,i)					{p->BRR=i;}   	// 输出低电平
#define digitalToggle(p,i)			{p->ODR ^=i;}   // 输出反转状态

// 基于寄存器控制
#define LEDR_TOGGLE		digitalToggle(LEDR_GPIO_PORT,LEDR_GPIO_PIN)
#define LEDG_TOGGLE		digitalToggle(LEDG_GPIO_PORT,LEDG_GPIO_PIN)
#define LEDB_TOGGLE		digitalToggle(LEDB_GPIO_PORT,LEDB_GPIO_PIN)

#define LEDR_ON				digitalLow(LEDR_GPIO_PORT,LEDR_GPIO_PIN)
#define LEDG_ON				digitalLow(LEDG_GPIO_PORT,LEDG_GPIO_PIN)
#define LEDB_ON				digitalLow(LEDB_GPIO_PORT,LEDB_GPIO_PIN)
#define LEDR_OFF			digitalHigh(LEDR_GPIO_PORT,LEDR_GPIO_PIN)
#define LEDG_OFF			digitalHigh(LEDG_GPIO_PORT,LEDG_GPIO_PIN)
#define LEDB_OFF			digitalHigh(LEDB_GPIO_PORT,LEDB_GPIO_PIN)

/******************************************
* 基本混色，使用PWM可混出全彩颜色，效果更好
******************************************/
// 红
#define LED_RED \
					LEDR_ON; \
					LEDG_OFF; \
					LEDB_OFF

// 绿
#define LED_GREEN \
					LEDR_OFF; \
					LEDG_ON; \
					LEDB_OFF
					
// 蓝
#define LED_BLUE \
					LEDR_OFF; \
					LEDG_OFF; \
					LEDB_ON

// 黄（红+绿）
#define LED_YELLOW \
					LEDR_ON; \
					LEDG_ON; \
					LEDB_OFF

// 紫（红+蓝）
#define LED_PURPLE \
					LEDR_ON; \
					LEDG_OFF; \
					LEDB_ON
					
// 青（绿+蓝）
#define LED_CYAN \
					LEDR_OFF; \
					LEDG_ON; \
					LEDB_ON

// 白（红+绿+蓝）
#define LED_WHITE \
					LEDR_ON; \
					LEDG_ON; \
					LEDB_ON
					
// 黑（全部关闭）
#define LED_RGBOFF \
					LEDR_OFF; \
					LEDG_OFF; \
					LEDB_OFF

void LED_GPIO_Config(void);
					
#endif
